/*************************************************
* Title：TinyToolKit
* Author：Opportunity 
* Describe：实现Json的序列化和反序列化
* CreateTime：2020-04-05 21:49:49
* Version：1.0
* Modify Recorder：
*************************************************/

using System;

namespace TinyToolKit
{
    public static partial class TinyUtility
    {
        public static partial class Json
        {
            private static IJsonTemplate _template;

            private static IJsonTemplate _jsonTemplate
            {
                get => _template ?? (_template = new DefaultJsonTemplate());
                set => _template = value;
            }

            public static void SetJsonTemplate(IJsonTemplate jsonTemplate)
            {
                _jsonTemplate = jsonTemplate;
            }

            /// <summary>
            /// 将对象序列化为JSON字符串
            /// </summary>
            /// <param name="obj">需要序列化的对象</param>
            /// <returns>返回序列化后的JSON字符串</returns>
            public static string ToJson(object obj)
            {
                if (obj == null) return string.Empty;
                if (_jsonTemplate == null)
                    TLogTool.Error("Json的默认函数集模板不能为Null");
                return _jsonTemplate?.ToJson(obj);
            }

            /// <summary>
            /// 将Json字符串反序列化为对象
            /// </summary>
            /// <typeparam name="T">对象的类型</typeparam>
            /// <param name="json">需要反序列化的JSON字符串</param>
            /// <returns>返回序列化后的对象</returns>
            public static T ToObject<T>(string json)
            {
                if (string.IsNullOrEmpty(json)) return default(T);

                if (_jsonTemplate == null)
                    TLogTool.Error("Json的默认函数集模板不能为Null");
                return _jsonTemplate.ToObject<T>(json);
            }

            /// <summary>
            /// 将JSON字符串反序列化为对象
            /// </summary>
            /// <param name="objectType">对象类型</param>
            /// <param name="json">需要反序列化的JSON字符串</param>
            /// <returns>返回序列化后的对象</returns>
            public static object ToObject(Type objectType, string json)
            {
                if (objectType == null || string.IsNullOrEmpty(json)) return null;

                if (_jsonTemplate == null)
                    TLogTool.Error("Json的默认函数集模板不能为Null");
                return _jsonTemplate?.ToObject(objectType, json);
            }
        }
    }
}